home *** CD-ROM | disk | FTP | other *** search
/ Delphi 5 for Professionals / DELPHI5.iso / AddOns / Components / TEECHART / Src Code / TEEPOIN3.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1998-10-24  |  7.8 KB  |  273 lines

  1. {*****************************************}
  2. {   TeeChart-Pro 4.0                      }
  3. {   Copyright (c) 1995-98 David Berneda   }
  4. {     TPoint3DSeries                      }
  5. {*****************************************}
  6. {$I teedefs.inc}
  7. unit TeePoin3;
  8.  
  9. interface
  10.  
  11. Uses WinTypes, WinProcs, Classes, SysUtils, Graphics, Teengine, TeeSurfa,
  12.      Series, TeCanvas;
  13.  
  14. type
  15.      TPoint3DSeries=class;
  16.  
  17.      TSeriesClickPointer3DEvent=Procedure( Sender:TPoint3DSeries;
  18.                                            ValueIndex:Longint;
  19.                                            X, Y: Integer) of object;
  20.  
  21.      TPoint3DSeries = class(TCustom3DSeries)
  22.      private
  23.        FDepthSize : Double;
  24.        FLinePen   : TChartPen;
  25.        FPointer   : TSeriesPointer;
  26.        { events }
  27.        FOnClickPointer     : TSeriesClickPointer3DEvent;
  28.        FOnGetPointerStyle  : TOnGetPointerStyle;
  29.  
  30.        { internal }
  31.        IOldX     : Integer;
  32.        IOldY     : Integer;
  33.        IOldZ     : Integer;
  34.        Procedure SetDepthSize(Const Value:Double);
  35.        Procedure CalcZPositions(ValueIndex:Longint);
  36.        Procedure SetLinePen(Value:TChartPen);
  37.        Procedure SetPointer(Value:TSeriesPointer);
  38.      protected
  39.      public
  40.        Constructor Create(AOwner: TComponent); override;
  41.        Destructor Destroy; override;
  42.  
  43.        Procedure Assign(Source:TPersistent); override;
  44.        Procedure CalcHorizMargins(Var LeftMargin,RightMargin:Integer); override;
  45.        Procedure CalcVerticalMargins(Var TopMargin,BottomMargin:Integer); override;
  46.        Function Clicked(x,y:Integer):Longint; override;
  47.        Procedure DrawLegendShape(ValueIndex:Longint; Const Rect:TRect); override;
  48.        Procedure DrawMark( ValueIndex:Longint; Const St:String;
  49.                            APosition:TSeriesMarkPosition); override;
  50.        Procedure DrawValue(ValueIndex:Longint); override;
  51.        Procedure FillSampleValues(NumValues:Longint); override;
  52.        Function  GetEditorClass:String; override;
  53.        Function MaxZValue:Double; override;
  54.        Procedure PrepareForGallery(IsEnabled:Boolean); override;
  55.      published
  56.        property DepthSize:Double read FDepthSize write SetDepthSize;
  57.        property LinePen:TChartPen read FLinePen write SetLinePen;
  58.        property Pointer:TSeriesPointer read FPointer write SetPointer;
  59.        property TimesZOrder;
  60.        property XValues;
  61.        property YValues;
  62.        property ZValues;
  63.      { events }
  64.        property OnClickPointer:TSeriesClickPointer3DEvent read FOnClickPointer
  65.                                                           write FOnClickPointer;
  66.      end;
  67.  
  68. implementation
  69.  
  70. Uses Chart,TeeConst,TeeProCo;
  71.  
  72. Constructor TPoint3DSeries.Create(AOwner: TComponent);
  73. begin
  74.   inherited Create(AOwner);
  75.   FPointer:=TSeriesPointer.Create(Self);
  76.   FDepthSize:=4;
  77.   FLinePen:=CreateChartPen;
  78.   {$IFDEF TEETRIAL}
  79.   TeeTrial(ComponentState);
  80.   {$ENDIF}
  81. end;
  82.  
  83. Destructor TPoint3DSeries.Destroy;
  84. begin
  85.   FLinePen.Free;
  86.   FPointer.Free;
  87.   inherited Destroy;
  88. end;
  89.  
  90. Procedure TPoint3DSeries.SetPointer(Value:TSeriesPointer);
  91. Begin
  92.   FPointer.Assign(Value);
  93. end;
  94.  
  95. Procedure TPoint3DSeries.CalcZPositions(ValueIndex:Longint);
  96. begin
  97.   With ParentChart.DepthAxis do
  98.   begin
  99.     StartZ:=CalcYPosValue(ZValues[ValueIndex]);
  100.     EndZ:=StartZ+CalcYSizeValue(FDepthSize);
  101.   end;
  102. end;
  103.  
  104. Procedure TPoint3DSeries.CalcHorizMargins(Var LeftMargin,RightMargin:Integer);
  105. begin
  106.   inherited CalcHorizMargins(LeftMargin,RightMargin);
  107.   FPointer.CalcHorizMargins(LeftMargin,RightMargin);
  108. end;
  109.  
  110. Procedure TPoint3DSeries.CalcVerticalMargins(Var TopMargin,BottomMargin:Integer);
  111. begin
  112.   inherited CalcVerticalMargins(TopMargin,BottomMargin);
  113.   FPointer.CalcVerticalMargins(TopMargin,BottomMargin);
  114. end;
  115.  
  116. Procedure TPoint3DSeries.DrawValue(ValueIndex:Longint);
  117. var tmpColor : TColor;
  118.     tmpStyle : TSeriesPointerStyle;
  119.     tmpX     : Integer;
  120.     tmpY     : Integer;
  121. begin
  122.   CalcZPositions(ValueIndex);
  123.   With Pointer do
  124.   begin
  125.     tmpX:=CalcXPos(ValueIndex);
  126.     tmpY:=CalcYPos(ValueIndex);
  127.     if Visible then
  128.     begin { emulate TCustomSeries.DrawPointer method }
  129.       tmpColor:=ValueColor[ValueIndex];
  130.       PrepareCanvas(tmpColor);
  131.       if Assigned(FOnGetPointerStyle) then
  132.          tmpStyle:=FOnGetPointerStyle(Self,ValueIndex)
  133.       else
  134.          tmpStyle:=FPointer.Style;
  135.       DrawPointer( ParentChart.View3D,tmpX,tmpY,HorizSize,VertSize,tmpColor,tmpStyle);
  136.     end;
  137.  
  138.     if ValueIndex>FirstValueIndex then
  139.     if FLinePen.Visible then
  140.     With ParentChart.Canvas do
  141.     begin
  142.       Pen.Assign(FLinePen);
  143.       BackMode:=cbmTransparent;
  144.       MoveTo3D(IOldX,IOldY,IOldZ);
  145.       LineTo3D(tmpX,tmpY,StartZ);
  146.     end;
  147.     IOldX:=tmpX;
  148.     IOldY:=tmpY;
  149.     IOldZ:=StartZ;
  150.   end;
  151. end;
  152.  
  153. Procedure TPoint3DSeries.DrawLegendShape(ValueIndex:Longint; Const Rect:TRect);
  154. var tmpColor:TColor;
  155. begin
  156.   if FPointer.Visible then
  157.   begin
  158.     if ValueIndex=-1 then tmpColor:=SeriesColor
  159.                      else tmpColor:=ValueColor[ValueIndex];
  160.     FPointer.DrawLegendShape(tmpColor,Rect,FLinePen.Visible);
  161.   end
  162.   else inherited DrawLegendShape(ValueIndex,Rect)
  163. end;
  164.  
  165. Procedure TPoint3DSeries.FillSampleValues(NumValues:Longint);
  166. var t:Longint;
  167. Begin
  168.   for t:=1 to NumValues do
  169.     AddXYZ( Random(100), Random(100), Random(100){$IFNDEF D4},'', clTeeColor{$ENDIF});
  170. end;
  171.  
  172. Procedure TPoint3DSeries.SetDepthSize(Const Value:Double);
  173. begin
  174.   SetDoubleProperty(FDepthSize,Value);
  175. end;
  176.  
  177. Function TPoint3DSeries.MaxZValue:Double;
  178. begin
  179.   result:=ZValues.MaxValue+FDepthSize;
  180. end;
  181.  
  182. Procedure TPoint3DSeries.DrawMark( ValueIndex:Longint; Const St:String;
  183.                                    APosition:TSeriesMarkPosition);
  184. var tmp:Integer;
  185. begin
  186.   CalcZPositions(ValueIndex);
  187.   if FPointer.Visible then Marks.ZPosition:=(StartZ+EndZ) div 2
  188.                       else Marks.ZPosition:=StartZ;
  189.   tmp:=Marks.ArrowLength;
  190.   With APosition do
  191.   begin
  192.     Dec(LeftTop.Y,tmp);
  193.     Dec(ArrowTo.Y,tmp);
  194.   end;
  195.   inherited DrawMark(ValueIndex,St,APosition);
  196. end;
  197.  
  198. Procedure TPoint3DSeries.SetLinePen(Value:TChartPen);
  199. Begin
  200.   FLinePen.Assign(Value);
  201. end;
  202.  
  203. Procedure TPoint3DSeries.Assign(Source:TPersistent);
  204. begin
  205.   if Source is TPoint3DSeries then
  206.   With TPoint3DSeries(Source) do
  207.   begin
  208.     Self.FPointer.Assign(FPointer);
  209.     Self.FDepthSize:=FDepthSize;
  210.     Self.FLinePen.Assign(FLinePen);
  211.   end;
  212.   inherited Assign(Source);
  213. end;
  214.  
  215. Function TPoint3DSeries.GetEditorClass:String;
  216. Begin
  217.   result:='TPoint3DSeriesEditor'; { <-- dont translate ! }
  218. end;
  219.  
  220. Procedure TPoint3DSeries.PrepareForGallery(IsEnabled:Boolean);
  221. begin
  222.   inherited PrepareForGallery(IsEnabled);
  223.   LinePen.Color:=clNavy;
  224. end;
  225.  
  226. Function TPoint3DSeries.Clicked(x,y:Integer):Longint;
  227. var t    : Longint;
  228.     tmpX : Integer;
  229.     tmpY : Integer;
  230.     OldX : Integer;
  231.     OldY : Integer;
  232. begin
  233.   OldX:=X;
  234.   OldY:=Y;
  235.   result:=inherited Clicked(x,y);
  236.   if result=TeeNoPointClicked then
  237.   if FPointer.Visible then
  238.   for t:=0 to Count-1  do
  239.   begin
  240.     tmpX:=CalcXPos(t);
  241.     tmpY:=CalcYPos(t);
  242.     X:=OldX;
  243.     Y:=OldY;
  244.     if ParentChart<>nil then
  245.     With ParentChart do
  246.       Canvas.Calculate2DPosition(X,Y,DepthAxis.CalcYPosValue(ZValues[t]));
  247.     if (Abs(tmpX-X)<FPointer.HorizSize) and { <-- Canvas.Zoom? }
  248.        (Abs(tmpY-Y)<FPointer.VertSize) then
  249.     begin
  250.       if Assigned(FOnClickPointer) then FOnClickPointer(Self,t,OldX,OldY);
  251.       result:=t;
  252.       break;
  253.     end;
  254.   end;
  255. end;
  256.  
  257. { Un-register the Series }
  258. Procedure TeePoint3DExitProc; far;
  259. begin
  260.   UnRegisterTeeSeries([TPoint3DSeries]);
  261. end;
  262.  
  263. { Register the Series at Chart gallery }
  264. initialization
  265.   RegisterTeeSeries( TPoint3DSeries, TeeMsg_GalleryPoint3D, TeeMsg_GalleryExtended, 1 );
  266. {$IFDEF D1}
  267.   AddExitProc(TeePoint3DExitProc);
  268. {$ELSE}
  269. finalization
  270.   TeePoint3DExitProc;
  271. {$ENDIF}
  272. end.
  273.